package com.elasticsearch.cloud.monitor.metric.common.rule.filter;

import com.google.common.base.Objects;

import java.util.Map;


public class TagVNotKeyFilter extends TagVFilter {
    /**
     * Name of this filter
     */
    final public static String FILTER_NAME = "not_key";

    public TagVNotKeyFilter(final String tagk, final String filter) {
        super(tagk, "");
        if (filter != null && filter.length() > 0) {
            throw new IllegalArgumentException("The filter must be empty for the " + FILTER_NAME + " filter");
        }
    }

    @Override
    public boolean match(Map<String, String> tags) {
        if (tags.containsKey(tagk)) {
            return false;
        }
        return true;
    }

    @Override
    public String getType() {
        return FILTER_NAME;
    }

    @Override
    public String debugInfo() {
        return "{}";
    }

    @Override
    public boolean equals(final Object obj) {
        if (obj == null) {
            return false;
        }
        if (!(obj instanceof TagVRegexFilter)) {
            return false;
        }
        if (obj == this) {
            return true;
        }
        final TagVNotKeyFilter filter = (TagVNotKeyFilter) obj;
        return Objects.equal(tagk, filter.tagk);
    }

    @Override
    public int hashCode() {
        return Objects.hashCode(tagk);
    }

    /**
     * @return a string describing the filter
     */
    public static String description() {
        return "Skips any time series with the given tag key, regardless of the "
            + "value. This can be useful for situations where a metric has "
            + "inconsistent tag sets. NOTE: The filter value must be null or an " + "empty string.";
    }

    /**
     * @return a list of examples showing how to use the filter
     */
    public static String examples() {
        return "host=not_key()  {\"type\":\"not_key\",\"tagk\":\"host\"," + "\"filter\":\"\",\"groupBy\":false}";
    }
}

